// Το singleton "ego" αφορά στον παίκτη που τρέχει το πρόγραμμα και περιέχει
// σκηνικά στοιχεία που αφορούν τον συγκεκριμένο παίκτη στη συγκεκριμένη
// συνεδρία του με τον «Πρεφαδόρο». Αυτά τα στοιχεία είναι ο παίκτης αυτός
// καθαυτός, η συνεδρία τού παίκτη, το τραπέζι που ίσως συμμετέχει κλπ.

Prefadoros.ego = {
	login: null,

	pektis: null,

	sinedria: null,

	trapezi: null,

	prin: {},

	fixedDOM: false,
};

Prefadoros.ego.fetchThesi = function() {
	return Skiniko.fetchSinedria(Prefadoros.ego.login).fetchThesi();
}

Prefadoros.ego.prinKeep = function() {
	var i, sinedria, trapezi;

	for (i in Prefadoros.ego.prin) delete Prefadoros.ego.prin[i];
	sinedria = Skiniko.isSinedria(Prefadoros.ego.login);
	Prefadoros.ego.fixedDOM = false;

	if (!sinedria) return;
	if (sinedria.oxiTrapezi()) return;

	Prefadoros.ego.prin.trapezi = Prefadoros.ego.sinedria.trapezi;
	Prefadoros.ego.prin.thesi = Prefadoros.ego.sinedria.thesi;
	if (Prefadoros.ego.sinedria.isTheatis()) Prefadoros.ego.prin.theatis = true;
}

Prefadoros.ego.alagi = function() {
	if (Prefadoros.ego.sinedria.trapezi != Prefadoros.ego.prin.trapezi) return true;
	if (Prefadoros.ego.sinedria.thesi != Prefadoros.ego.prin.thesi) return true;
	if (Prefadoros.ego.sinedria.theatis != Prefadoros.ego.prin.theatis) return true;
	return false;
}

Prefadoros.ego.oxiAlagi = function() {
	return !Prefadoros.ego.alagi();
}

// Η μέθοδος "setup" εφαρμόζεται στην αρχή του προγράμματος και θέτει το
// login name τού παίκτη από τα στοιχεία τού session.

Prefadoros.ego.setup = function() {
	if (!Client.hasOwnProperty('session')) globals.fatal('Prefadoros.ego.setup: missing "session" property');
	if (!Client.session.hasOwnProperty('pektis')) globals.fatal('Prefadoros.ego.setup: ακαθόριστος παίκτης');
	Prefadoros.ego.login = Client.session.pektis;
	return Prefadoros.ego;
}

// Η μέθοδος "refresh" εφαρμόζεται συνήθως μετά από δομικές αλλαγές στο σκηνικό,
// δηλαδή αλλαγές που μπορούν να επηρεάσουν τα σκηνικά στοιχεία τού παίκτη, π.χ.
// άνοιγμα τραπεζιού, αποδοχή πρόσκλησης κλπ, εφαρμόζεται όμως και πριν από κάθε
// ενέργεια που βασίζεται σε αυτά τα στοιχεία, π.χ. πριν την αποστολή πρόσκλησης,
// πριν το κλείσιμο τραπεζιού κλπ. Σκοπός τής μεθόδου είναι να επικαιροποιήσει
// όλα τα σκηνικά στοιχεία στο "ego" object σύμφωνα με την τρέχοντα σκηνικά
// δεδομένα.

Prefadoros.ego.refresh = function() {
	Prefadoros.ego.pektis = Skiniko.fetchPektis(Prefadoros.ego.login);
	Prefadoros.ego.sinedria = Skiniko.fetchSinedria(Prefadoros.ego.login);
	Prefadoros.ego.trapezi = Skiniko.isTrapezi(Prefadoros.ego.sinedria.trapezi);
	Prefadoros.ego.prin = {};
	return Prefadoros.ego;
}

Prefadoros.ego.miaPrefaFixDOM = function() {
	var miaPrefa = $('#miaPrefa').akrivosEna();

	if (Prefadoros.ego.sinedria.isTrapezi()) {
		miaPrefa.stop().animate({
			opacity: 0,
			maxHeight: 0,
		});
	}
	else {
		miaPrefa.css({
			display: 'block',
		}).stop().animate({
			opacity: 1,
			maxHeight: '200px',
		});
	}
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Prefadoros.ego.isTrapezi = function() {
	return Prefadoros.ego.trapezi;
}

Prefadoros.ego.oxiTrapezi = function() {
	return !Prefadoros.ego.isTrapezi();
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Prefadoros.ego.isPektis = function() {
	return Prefadoros.ego.sinedria.isPektis();
}

Prefadoros.ego.oxiPektis = function() {
	return !Prefadoros.ego.sinedria.isPektis();
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Prefadoros.ego.isTzogadoros = function() {
	if (Prefadoros.ego.oxiTrapezi()) return false;
	if (Prefadoros.ego.oxiPektis()) return false;
	return (Prefadoros.ego.trapezi.tzogadoros == Prefadoros.ego.sinedria.thesi);
}

Prefadoros.ego.oxiTzogadoros = function() {
	return !Prefadoros.ego.isTzogadoros();
}

Prefadoros.ego.thesiTzogadoros = function() {
	if (Prefadoros.ego.oxiTrapezi()) return false;
	return (Prefadoros.ego.trapezi.tzogadoros == Prefadoros.ego.sinedria.thesi);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Prefadoros.ego.isEpomenos = function() {
	if (Prefadoros.ego.oxiTrapezi()) return false;
	return (Prefadoros.ego.trapezi.epomenos == Prefadoros.ego.sinedria.thesi);
}

Prefadoros.ego.oxiEpomenos = function() {
	return !Prefadoros.ego.isEpomenos();
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Prefadoros.ego.isEpomenosPektis = function() {
	if (Prefadoros.ego.oxiTrapezi()) return false;
	if (Prefadoros.ego.oxiPektis()) return false;
	return (Prefadoros.ego.trapezi.epomenos == Prefadoros.ego.sinedria.thesi);
}

Prefadoros.ego.oxiEpomenosPektis = function() {
	return !Prefadoros.ego.isEpomenosPektis();
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η μέθοδος "isDexia" επιστρέφει true αν η θέση τού παίκτη που τρέχει
// το πρόγραμμα βρίσκεται δεξιά από τη θέση που περνάμε ως παράμετρο.

Prefadoros.ego.isDexia = function(thesi) {
	return(thesi.epomenosPektis() == Prefadoros.ego.sinedria.thesi);
}

// Η μέθοδος "isAristera" επιστρέφει true αν η θέση τού παίκτη που τρέχει
// το πρόγραμμα βρίσκεται αριστερά από τη θέση που περνάμε ως παράμετρο.

Prefadoros.ego.isAristera = function(thesi) {
	return(Prefadoros.ego.sinedria.thesi.epomenosPektis() == thesi);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η μέθοδος "isEgo" εφαρμόζεται σε συνεδρίες και ελέγχει αν ο παίκτης τής
// συνεδρίας είναι ο παίκτης που τρέχει το πρόγραμμα.

Sinedria.prototype.isEgo = function(callbackEgo, callbackAlos) {
	if (!arguments.length) return this.pektis.isEgo();
	if (this.pektis.isEgo()) callbackEgo(this);
	else callbackAlos(this);
}

Sinedria.prototype.oxiEgo = function() {
	return !this.isEgo();
}

// Η μέθοδος "isEgo" εφαρμόζεται σε παίκτες και ελέγχει αν ο παίκτης είναι
// ο παίκτης που τρέχει το πρόγραμμα.

Pektis.prototype.isEgo = function() {
	return this.login.isEgo();
}

Pektis.prototype.oxiEgo = function() {
	return !this.isEgo();
}

// Η μέθοδος "isEgo" εφαρμόζεται σε τραπέζια και ελέγχει αν ο παίκτης
// σχετίζεται με το ανά χείρας τραπέζι.

Trapezi.prototype.isEgo = function() {
	if (Prefadoros.ego.oxiTrapezi()) return false;
	return(Prefadoros.ego.trapezi.kodikos == this.kodikos);
}

Trapezi.prototype.oxiEgo = function() {
	return !this.isEgo();
}

// Η μέθοδος "isEgo" εφαρμόζεται σε strings και ελέγχει αν το string ως login
// name είναι ίδιο με το login name τού παίκτη που τρέχει το πρόγραμμα.

String.prototype.isEgo = function() {
	return (this == Prefadoros.ego.login);
}

String.prototype.oxiEgo = function() {
	return !this.isEgo();
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Prefadoros.ego.fixDOM = function() {
	if (Prefadoros.ego.fixedDOM) return;
	Prefadoros.ego.fixedDOM = true;

	if (Prefadoros.ego.oxiAlagi()) return;
	var tsoxajql = Trapezi.tsoxaJQL();

	if (Prefadoros.ego.sinedria.oxiTrapezi()) {
		Trapezi.tsoxaClearDOM();
		tsoxajql.addClass('tsoxaKeni').removeClass('tsoxaTheatis').
			find('.tsoxaData').removeClass('theatis');
		return;
	}

	if (Prefadoros.ego.sinedria.trapezi != Prefadoros.ego.prin.trapezi) {
		Prefadoros.ego.trapezi.tsoxaDOM();
		tsoxajql.removeClass('tsoxaKeni');
	}

	if (Prefadoros.ego.sinedria.theatis) {
		if (!Prefadoros.ego.prin.theatis) tsoxajql.addClass('tsoxaTheatis').
			find('.tsoxaData').addClass('theatis');
	}
	else if (Prefadoros.ego.prin.theatis) tsoxajql.removeClass('tsoxaTheatis').
		find('.tsoxaData').removeClass('theatis');
}
